import pandas as pd  # 导入Pandas库，用于数据处理
import matplotlib.pyplot as plt  # 导入Matplotlib库，用于绘制图表
'''--------------------------------------------------数据处理----------------------------------------------------------'''
#读取文件
df=pd.read_excel('D:\python lianxi\学生成绩统计和可视化\source.xlsx')
#看一下数据中是否有缺失值并统计数量
print(df.isnull().sum())
#在原dataframe中用0填充缺失值
df.fillna(0, inplace=True)
#计算综合成绩
df2=pd.DataFrame(df['attendance']*0.3+df['exam']*0.7,columns=['overall'])
#将计算的综合成绩拼接到原dataframe中
df['overall']=df2
#增加一个新的列判断学生是否通过考核
df['pass']=df['overall'].apply(lambda x:'yes' if  x>=60 else 'no')
#分别获取男女中的通过与未通过情况
df3=df[df['gender']=='男']
df4=df[df['gender']=='女']
#男生中通过的情况
df5=df3[df3['pass']=='yes']
#男生中未通过的情况
df6=df3[df3['pass']=='no']
#女生中通过的情况
df7=df4[df4['pass']=='yes']
#女生中未通过的情况
df8=df4[df4['pass']=='no']
# 划分成绩等级
def get_grade(score):
    if score >= 90:
        return '优秀'
    elif score >= 80:
        return '良好'
    elif score >= 70:
        return '中等'
    elif score >= 60:
        return '及格'
    else:
        return '不及格'
#
df['grade'] = df['overall'].apply(get_grade)

#把结果保存新的excel表格
df.to_excel('D:\python lianxi\学生成绩统计和可视化\\new_source.xlsx',index=False)
'''------------------------------------------数据可视化----------------------------------------------------------------'''
#绘制直方图展示最终成绩
#设置figure对象
plt.figure(figsize=(10,7))
#设置黑体解决中文图标显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.subplot(2,3,1)
plt.title('综合成绩直方图')
plt.xlabel('成绩区间')
plt.ylabel('学生人数')
#绘制直方图并获取其返回值
a,b,c=plt.hist(x=df['overall'],bins=[0,10,20,30,40,50,60,70,80,90,100])
#设置轴的刻度
plt.xticks(b)
#直方图上添加每个区间的人数
for i in range(len(a)):
    x=(b[i]+b[i+1])*0.5
    y=a[i]+0.1
    plt.subplot(2,3,1).text(x,y,f'{int(a[i])}',ha='center',va='bottom')

#使用饼图展示是否通过的比例
plt.subplot(2,3,2)
plt.title('学生通过率统计图')
#使用dataframe中的value_counts方法获取通过与未通过的人数
yes,no=df.value_counts(subset=['pass'])
#绘制饼图
plt.pie([yes,no],labels=['通过','未通过'],autopct='%.2f%%')

#使用饼图分别对比男女生中通过和未通过的比例
plt.subplot(2,3,3)
plt.pie([df5['pass'].size,df6['pass'].size],labels=['男生通过','男生未通过'],autopct='%.2f%%')
plt.title('男生通过率统计图')
plt.subplot(2,3,4)
plt.pie([df7['pass'].size,df8['pass'].size],labels=['女生通过','女生未通过'],autopct='%.2f%%')
plt.title('女生通过率统计图')



#成绩等级占比
plt.subplot(2,3,5)
plt.title('成绩等级占比')
grade_counts = df['grade'].value_counts()
plt.pie(grade_counts, labels=grade_counts.index, autopct='%.1f%%')

# 调整子图间距
plt.tight_layout()
plt.show()


